
package com.syz.fs.file;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.DefaultFileRegion;
import io.netty.channel.FileRegion;
import io.netty.channel.SimpleChannelInboundHandler;

import java.io.File;
import java.io.RandomAccessFile;
/**
 * 解析字符串为文件名，，
 * 
 * @author SYZ
 * @date 2017年11月23日 上午9:01:34
 * @version 1.0.0
 * @see com.syz.fs.file.FileServerHandler
 */
public class FileServerHandler extends SimpleChannelInboundHandler<String> {

    private static final String CR = System.getProperty("line.separator");



	@Override
	protected void channelRead0(ChannelHandlerContext ctx, String msg)
			throws Exception {

		System.out.println("req path:"+msg);
		File file = new File(msg);
		if (file.exists()) {
		    if (!file.isFile()) {
			ctx.writeAndFlush("Not a file : " + file + CR);
			return;
		    }
		    ctx.write(file + " " + file.length() + CR);
		    RandomAccessFile randomAccessFile = new RandomAccessFile(msg, "r");//只读方式打开文件，NIO文件编程，必须先打开
		    FileRegion region = new DefaultFileRegion(//netty提供DefaultFileRegion进行文件传输；参数分别为 FileChannel，起始点，总的字节
			    randomAccessFile.getChannel(), 0, randomAccessFile.length());
		    ctx.write(region); //完成文件的读取 并写到当前channel的工作，，不是编码，是基于FileChannel 固定写好的。。
		    ctx.writeAndFlush(CR);
		    randomAccessFile.close();
		} else {
		    ctx.writeAndFlush("File not found: " + file + CR);
		}
	    
	}
	
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
    	    throws Exception {
    	cause.printStackTrace();
    	ctx.close();
        }
    
}
